package onez.project.core.filter;

import onez.project.core.context.GatewayContext;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * 过滤器链 用于存储实现的过滤器的信息 并且按照顺序进行执行
 */
@Slf4j
public class GatewayFilterChain {

    // 存储过滤器的列表
    private final List<Filter> filters = new ArrayList<>();

    /**
     * 向过滤器链中添加多个过滤器
     * 因为至少存在router过滤器，所以说只可能存在多个
     * @param filter 要添加的过滤器列表
     * @return 返回过滤器链对象，支持链式调用
     */
    public GatewayFilterChain addFilterList(List<Filter> filter){
        filters.addAll(filter);
        return this;
    }

    /**
     * 执行过滤器处理流程
     * @param ctx 网关上下文对象，包含请求和响应等信息
     * @return 返回处理后的网关上下文对象
     * @throws Exception 过滤器执行过程中可能抛出的异常
     */
    public GatewayContext doFilter(GatewayContext ctx) throws Exception {
        // 如果没有过滤器，则直接返回上下文对象
        if(filters.isEmpty()){
            return ctx;
        }
        try {
            // 遍历过滤器列表，依次执行每个过滤器的处理方法
            for(Filter fl: filters){
                fl.doFilter(ctx);
                // 如果上下文对象标记为终止，则跳出循环，不再执行后续过滤器
                if (ctx.isTerminated()){
                    break;
                }
            }
        }catch (Exception e){
            // 记录过滤器执行过程中的异常信息，并重新抛出异常
            log.error("执行过滤器发生异常,异常信息：{}",e.getMessage());
            throw e;
        }
        // 返回处理后的上下文对象
        return ctx;
    }
}
